package server;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Random;

import common.ComandiException;



public abstract class Dinosauro implements Serializable{

	private String idDino;
	private char tipo;
	private int D;
	private static final int Dmax =5;
	private int E;
	private int Emax;
	private int vita;
	private int distanzaMassima;
	private int turniVissuti;
	private Giocatore padrone;
	private VistaLocale vistaLocale;
	private Posizione posizioneAttuale;
	private Posizione posizioneAttualeUtente;
	private boolean staDeponendo= false;
	private boolean staCrescendo= false;
	private boolean staMuovendo= false;
	public static int ultimoIdUsato =0;
	public static final int OK=0;
	private static Random generatoreCasuale = new Random();
	
	public int getE() {
		return E;
	}
	public void setE(int e) {
		E = e;
	}
	public int getEmax() {
		return Emax;
	}
	public void setEmax(int emax) {
		Emax = emax;
	}
	public int getDistanzaMassima() {
		return distanzaMassima;
	}
	public void setDistanzaMassima(int distanzaMassima) {
		this.distanzaMassima = distanzaMassima;
	}
	public String getIdDino() {
		return idDino;
	}
	public void setIdDino(String idDino) {
		this.idDino = idDino;
	}
	public VistaLocale getVistaLocale() {
		return vistaLocale;
	}
	public void setVistaLocale(VistaLocale vistaLocale) {
		this.vistaLocale = vistaLocale;
	}
	public int getTurniVissuti() {
		return turniVissuti;
	}
	public void setTurniVissuti(int turniVissuti) {
		this.turniVissuti = turniVissuti;
	}
	public Posizione getPosizioneAttuale() {
		return posizioneAttuale;
	}
	public void setPosizioneAttuale(Posizione posizioneAttuale) {
		this.posizioneAttuale = posizioneAttuale;
	}
	public boolean isStaDeponendo() {
		return staDeponendo;
	}
	public void setStaDeponendo(boolean staDeponendo) {
		this.staDeponendo = staDeponendo;
	}
	public boolean isStaCrescendo() {
		return staCrescendo;
	}
	public void setStaCrescendo(boolean staCrescendo) {
		this.staCrescendo = staCrescendo;
	}
	public boolean isStaMuovendo() {
		return staMuovendo;
	}
	public void setStaMuovendo(boolean staMuovendo) {
		this.staMuovendo = staMuovendo;
	}
	public int getD() {
		return D;
	}
	public void setD(int d) {
		D = d;
	}
	public Giocatore getPadrone() {
		return padrone;
	}
	public void setPadrone(Giocatore padrone) {
		this.padrone = padrone;
	}
	public char getTipo() {
		return tipo;
	}
	public void setTipo(char tipo) {
		this.tipo = tipo;
	}
	public Posizione getPosizioneAttualeUtente() {
		posizioneAttualeUtente.setY(Mappa.RIGHE_MAPPA-1-posizioneAttuale.getY());
		posizioneAttualeUtente.setX(posizioneAttuale.getX());
		return posizioneAttualeUtente;
	}
	public void setPosizioneAttualeUtente(Posizione posizioneAttualeUtente) {
		this.posizioneAttualeUtente = posizioneAttualeUtente;
	}
	public Dinosauro(Giocatore g,String nomeRazza,Posizione posizioneIniziale,Mappa mappa){
		//inizializzazione IDDINO,padrone
		ultimoIdUsato++;
		Integer idInt = ultimoIdUsato;
		idDino = nomeRazza+idInt.toString();
		padrone=g;
		//inizializzazione parametri dinosauro
		D=1;
		Emax=1000*D;
		E=1000;
		int numeroCasuale;
		numeroCasuale=generatoreCasuale.nextInt(13)+24;// 30+-20%
		vita=numeroCasuale;
		this.setPosizioneAttuale(posizioneIniziale);
		vistaLocale = new VistaLocale();
		turniVissuti=0;
		posizioneAttualeUtente=new Posizione();
		aggiornaVistaLocale(mappa);
	}
		
	public int crescitaDinosauro() throws ComandiException{
		if(staDeponendo==true || staCrescendo==true || staMuovendo==true)
			throw new ComandiException(ComandiException.RAGGIUNTO_LIMITE_MOSSE_DINOSAURO);	
		if(D>Dmax)
			throw new ComandiException(ComandiException.NO_ALTRA_CRESCITA);	
		if(E <= 1000*D/2){
			E=0;
			throw new ComandiException(ComandiException.MORTE_PER_INEDIA);
		}	
		E=E-1000*D/2;
		staCrescendo=true;
		D++;
		Emax=1000*D;
		return E;
	}
	
	public int deposizioneUovoDinosauro() throws ComandiException{
		if(staDeponendo==true || staCrescendo==true || staMuovendo==true)
			throw new ComandiException(ComandiException.RAGGIUNTO_LIMITE_MOSSE_DINOSAURO);
		if(E <= 1500){
			E=0;
			throw new ComandiException(ComandiException.MORTE_PER_INEDIA);
		}	
		E=E-1500;
		staDeponendo=true;
		return E;
	}
	
	public abstract String movimentoDinosauro(Posizione dest,Mappa mappa,ArrayList<Giocatore> giocatoriInPartita) throws ComandiException;
	
	public void aggiornaVistaLocale(Mappa mappa){
		vistaLocale.aggiorna(mappa,D,posizioneAttuale);	
	}
	
	public boolean combattimento(Dinosauro dinoA,Dinosauro dinoB){
		int forzaA=0;
		int forzaB=0;
		if(dinoA instanceof Carnivoro)
			forzaA=2*dinoA.getD()*dinoA.getE(); // F=2*D*E
		else
			forzaA=dinoA.getD()*dinoA.getE(); // F=D*E
		if(dinoB instanceof Carnivoro)
			forzaB=2*dinoB.getD()*dinoB.getE(); // F=2*D*E;
		else
			forzaB=dinoB.getD()*dinoB.getE(); // F=D*E;
		if(forzaA>=forzaB)
			return true;
		else{
			return false;
		}	
	}
	
	public void azzeraAzioniDino(){
		setStaCrescendo(false);
		setStaDeponendo(false);
		setStaMuovendo(false);
	}
	
	public boolean invecchiamento(){
		turniVissuti++;
		if(turniVissuti>vita)
			return false;//morto di vecchiaia
		else 
			return true;//vivo
	}
			
}
